package com.ftg.learn.framework.spring.javabase;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

/**
 * 代理类
 *  切面类 :
 *
 * @author kangjx
 * @version 1.0
 * @date 2023/9/20 下午3:24
 */
@Component
@Aspect
@EnableAspectJAutoProxy
public class AopClass {

    @Autowired
    HttpServletRequest request;

    @Before("execution(public * com.ftg.learn.framework.spring.javabase.Dark.testAop(..))")
    public void say1(){
        System.out.println("我在你之前走....");
    }

    @After("execution(public * com.ftg.learn.framework.spring.javabase.Dark.*(..))")
    public void say2(){
        System.out.println("我在你之后走....");
    }

    @Around("execution(public * com.ftg.learn.framework.spring.javabase.Dark.*(..))")
    public Object say3(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("我在圈里之前....");
//        ProceedingJoinPoint
//        String toString();         //连接点所在位置的相关信息
//        String toShortString();    //连接点所在位置的简短相关信息
//        String toLongString();     //连接点所在位置的全部相关信息
//        Object getThis();          //返回AOP代理对象，也就是com.sun.proxy.$Proxy18
//        Object getTarget();        //返回目标对象，一般我们都需要它或者（也就是定义方法的接口或类，为什么会是接口呢？
//        //这主要是在目标对象本身是动态代理的情况下，例如Mapper。所以返回的是定义方法的对象如
//        //aoptest.daoimpl.GoodDaoImpl或com.b.base.BaseMapper<T, E, PK>）
//        Object[] getArgs();        //返回被通知方法参数列表
//        Signature getSignature();  //返回当前连接点签名。其getName()方法返回方法的FQN，如void aoptest.dao.GoodDao.delete()
//        //或com.b.base.BaseMapper.insert(T)(需要注意的是，很多时候我们定义了子类继承父类的时候，
//        //我们希望拿到基于子类的FQN，无法直接拿到，要依赖于
//        //AopUtils.getTargetClass(point.getTarget())获取原始代理对象，下面会详细讲解)
//        SourceLocation getSourceLocation();//返回连接点方法所在类文件中的位置
//        String getKind();           //连接点类型
//        StaticPart getStaticPart(); //返回连接点静态部分

//        request.getRemoteAddr()  ip地址
//        request.getMethod()  get post put delete

        Object obj = proceedingJoinPoint.proceed();
        System.out.println("我在圈里之后....");
        return obj;
    }

}
